package lv.servidordisqueria.server.accion;

import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;

import lv.mensajeriadisqueria.dto.UsuarioDto;
import lv.mensajeriadisqueria.idomain.IRol;
import lv.mensajeriadisqueria.idomain.IUsuario;
import lv.mensajeriadisqueria.mensaje.Mensaje;
import lv.servidordisqueria.domain.Usuario;
import lv.servidordisqueria.excepcion.DomainNoExistenteException;
import lv.servidordisqueria.repositorio.RolRepositorio;
import lv.servidordisqueria.repositorio.UsuarioRepositorio;

public class UsuarioAccion {

	/**
	 *  
	 * @param mensaje
	 * @return un nuevo mensaje para escribit
	 */
	public static Mensaje actuar(Mensaje mensaje) {
		Mensaje respuesta = new Mensaje();
		IUsuario usuario = (IUsuario)mensaje.getObjeto();
		if (Mensaje.ALTA.equalsIgnoreCase(mensaje.getMensaje())) {
			insertar(respuesta, usuario);
		} else if (Mensaje.BAJA.equalsIgnoreCase(mensaje.getMensaje())) {
			borrar(respuesta, usuario);
		} else if (Mensaje.MODIFICAR.equalsIgnoreCase(mensaje.getMensaje())) {
			modificar(respuesta, usuario);
		} else if (Mensaje.LOGIN.equalsIgnoreCase(mensaje.getMensaje())) {
			loginUsuario(respuesta, usuario);
		} else if (Mensaje.TODOS.equalsIgnoreCase(mensaje.getMensaje())) {
			buscarTodos(respuesta);
		}
		return respuesta;
	}

	
	private static void buscarTodos(Mensaje respuesta) {
		try {
			System.out.println("entro a buscas todos los usuario");
			Collection<IUsuario> todosUsuarios = UsuarioRepositorio.getInstance().buscarTodos();
			Collection<IUsuario> usuarios = new ArrayList<IUsuario>();
			for (IUsuario usuario : todosUsuarios) {
				usuarios.add(tranformarDomainToDto(usuario));
			}
			respuesta.setMensaje(Mensaje.ENVIO_TODOS);
			respuesta.setObjeto(usuarios);
			System.out.println("encontro todos");
		} catch (SQLException e) {
			respuesta.setMensaje(Mensaje.EXCEPTION);
			respuesta.setObjeto(e);
		} catch (DomainNoExistenteException e) {
			respuesta.setMensaje(Mensaje.EXCEPTION);
			respuesta.setObjeto(e);
		}
	}


	private static void loginUsuario(Mensaje respuesta, IUsuario usuario) {
		try {
			System.out.println("entro al login");
			respuesta.setMensaje(Mensaje.LOGGED);
			respuesta.setObjeto(tranformarDomainToDto(UsuarioRepositorio
					.getInstance().buscar("NOMBRE" , usuario.getNombre()).get(0)));
			System.out.println(Mensaje.LOGGED);
		} catch (SQLException e) {
			respuesta.setMensaje(Mensaje.EXCEPTION);
			respuesta.setObjeto(e);
		} catch (DomainNoExistenteException e) {
			respuesta.setMensaje(Mensaje.EXCEPTION);
			respuesta.setObjeto(e);
		}
	}

	private static void modificar(Mensaje respuesta, IUsuario usuario) {
		try {
			System.out.println("entro al Modificar");
			UsuarioRepositorio.getInstance().editar(usuario);
			respuesta.setMensaje(Mensaje.MODIFICADO);
			System.out.println(Mensaje.MODIFICADO);
		} catch (SQLException e) {
			respuesta.setMensaje(Mensaje.EXCEPTION);
			respuesta.setObjeto(e);
		}
	}

	private static void borrar(Mensaje respuesta, IUsuario usuario) {
		try {
			respuesta.setMensaje(Mensaje.BORRADO);
			UsuarioRepositorio.getInstance().borradoFisico(usuario);
		} catch (SQLException e) {
			respuesta.setMensaje(Mensaje.EXCEPTION);
			respuesta.setObjeto(e);
		}
	}

	private static void insertar(Mensaje respuesta, IUsuario usuario) {
		try {
			respuesta.setMensaje(Mensaje.INSERTADO);
			IUsuario usuario2 = UsuarioRepositorio.getInstance()
			.insertar(tranformarDtoToDomain(usuario));
			usuario.setClave(usuario2.getClave());
			respuesta.setObjeto(usuario);
		} catch (SQLException e) {
			respuesta.setMensaje(Mensaje.EXCEPTION);
			respuesta.setObjeto(e);
		} catch (DomainNoExistenteException e) {
			respuesta.setMensaje(Mensaje.EXCEPTION);
			respuesta.setObjeto(e);
		}
	}

	private static IUsuario tranformarDtoToDomain(IUsuario usuarioDto) {
		IRol rol = RolAccion.transformaDtoToDomain(usuarioDto.getRol());
		Usuario usuario = new Usuario(rol, usuarioDto.getNombre(), usuarioDto.getDescripcion(),
				usuarioDto.getClave());
		usuario.setIdUsuario(usuarioDto.getIdUsuario());
		return usuario;
	}
	
	private static IUsuario tranformarDomainToDto(IUsuario usuario) throws SQLException, DomainNoExistenteException {
		IRol rol = RolAccion.tranformarDomainToDto(RolRepositorio.getInstance()
				.buscarPorId(usuario.getRol().getIdRol()));
		UsuarioDto usuarioDto = new UsuarioDto(rol, usuario.getNombre(), 
				usuario.getDescripcion(), usuario.getClave());
		usuarioDto.setIdUsuario(usuario.getIdUsuario());
		return usuarioDto;
	}
}
